<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>(ES6)let关键字</title>
</head>

<body>
    <script>
        // if(true){
        //     //var 声明的变量没有块作用域，有变量提升
        //     //let声明的变量是块作用域
        //     //var a=100;
        //     let a=100;
        //     console.log(a)
        // }
        // console.log(a)  //报错


        // // let声明的变量没有变量提升
        // a++;
        // console.log(a);  //NaN
        // // var a = 100;
        // let a = 100;    //报错：在初始化之前不能访问



        // if 代码块的外部使用外层的 tmp 变量，内部使用内层的 tmp 变量。
        // 但是，函数 f 执行后，输出结果为 undefined ，
        // 原因在于变量提升，导致内层的 tmp 变量覆盖了外层的 tmp 变量。
        var tmp = new Date();
        function f() {
            console.log(tmp);
            if (false) {
                var tmp = 'hello world';
            }
        }
        f(); // undefined

        // var tmp = 100;
        // if (true) {
        //     // (var)存在与全局变量同名的变量时，优先使用局部变量（就近原则）
        //     //多个变量同名,作用域有效性遵循就近原则
        //     tmp = 'abc';
        //     console.log(tmp);   //abc
        //     // var tmp = 123;
        //     let tmp = 123;
        //     console.log(tmp);   //123
        // }
        // console.log(tmp);      //123



        //用来计数的循环变量泄露为全局变量
        // var arr = [];
        // for (var i = 0; i < 2; i++) {
        //     arr[i] = function () {
        //         console.log(i);
        //     }
        // }
        // arr[0]();   //2
        // arr[1]();   //2

        //每次循环会产生一个块级作用域
        let arr = [];
        for (let i = 0; i < 2; i++) {
            arr[i] = function () {
                console.log(i);
            }
        }
        arr[0]();   //0
        arr[1]();   //1

    </script>
</body>

</html>